# %% [markdown]
# 1. 如何为函数定义keyword-only参数（写出个例子即可）？
# 2. 什么是LEGB，请解释
# 3. 使用本周学习的技术改造第一周的计算器实现，其目标如下：
# 
#    1. 运行后提示让用户输入一个数字
#    2. 提示输入操作符（+ - * /）
#    3. 再次提示输入一个数字
#    4. 打印计算结果
#    5. 在不退出程序的前提下，可以允许用户继续输入新一组数据计
#    6. 尽可能改善用户体验（新需求）

# %%
# 1. 如何为函数定义keyword-only参数（写出个例子即可）？
# 答：def foo(x, y, /, *, a, b)
#     x,y 是position-only 参数，a,b是keyword-only参数
# 
# 函数参数类型： 
# - 普通参数：可以按照位置传参，也可以通过关键字传参，可以设置形参缺省值
# - 可变参数：可变位置参数（可以接受多个实参，将收集来的实参放在一个tuple中）；可变关键字参数（可以接受多个关键字参数，放入dict中）
# - keyword-only参数：*号后的参数
# - position-only参数：/后的参数
# - 参数列表一般顺序是：def foo(a,/,b,c=1,*args,*,d,e=2,**args) position-only->普通参数->缺省参数->*args->keywords-only(可带缺省值)->**args

# %%
# 2. 什么是LEGB，请解释
# 答：LEGB是变量名解析顺序：Local -> Enclosing（外层函数） -> Global -> Build-in

# %%
# 使用本周学习的技术改造第一周的计算器实现，其目标如下：

#    1. 运行后提示让用户输入一个数字
#    2. 提示输入操作符（+ - * /）
#    3. 再次提示输入一个数字
#    4. 打印计算结果
#    5. 在不退出程序的前提下，可以允许用户继续输入新一组数据计
#    6. 尽可能改善用户体验（新需求）



# %%
def isNum(num):
    try:
        float(num)
    except ValueError:
        return False
    else:
        return True

def isOperator(operator):
    if operator in ('+','-','*','/'):
        return True
    else:
        return False

def calculate(x, op, y):
    if op == "+":
        res = float(x) + float(y)
    elif op == "-":
        res = float(x) - float(y)
    elif op == "*":
        res = float(x) * float(y)
    elif op == "/" and y != "0":
        res = float(x) / float(y)
    return res
        

while True:
    n1 = input("请输入您想计算的第一个数字(不输入字符直接回车则退出程序):")
    if n1 == '': break
    elif isNum(n1):
        operator = input("请输入一个操作符(+ - * /)(不输入字符直接回车则退出程序): ")
        if operator == '': 
            break
        elif isOperator(operator):
            n2 = input("请输入您想计算的另一个数字：")
            if n2 == '': break
            elif isNum(n2):
                if operator == '/' and float(n2) == 0:
                    print('0不能作为除数,请重新输入')
                    continue
                else:
                    result = calculate(n1, operator, n2)
                    print("{} {} {} = {}".format(n1,operator,n2,result))
            else: 
                print('输入的第二个数字无效，请重新输入')
        else:
            print('输入的操作符无效，请重新输入')
            continue
    else:
        print('输入的第一个数字无效，请重新输入')
        continue
    


